package com.infore.statisticsAndAlarm.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 反射
 * @author Cold
 *
 */
public class ReflexUtil {
	/**
	 * 根据属性，获取get方法
	 * @param ob 对象
	 * @param name 属性名
	 * @return
	 * @throws Exception
	 */
	public static Object getValue(Object dto, String name) throws Exception {
		Method[] m = dto.getClass().getMethods();
		for (int i = 0; i < m.length; i++) {
			if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
				return m[i].invoke(dto);
			}
		}
		return null;
	}
	
	/**
	 * 根据属性，拿到set方法，并把值set到对象中
	 * @param obj 对象
	 * @param clazz 对象的class
	 * @param fileName 需要设置值得属性
	 * @param typeClass 对象内部属性的class
	 * @param value 对象内部属性的值
	 */
	public static void setValue(Object obj,Class<?> clazz,String filedName,Class<?> typeClass,Object value){
//		filedName = removeLine(filedName);
		String methodName = "set" + filedName.substring(0,1).toUpperCase()+filedName.substring(1);
		try{
			Method method =  clazz.getDeclaredMethod(methodName, new Class[]{typeClass});
			method.invoke(obj, new Object[]{getClassTypeValue(typeClass, value)});
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	/**
     * 通过class类型获取获取对应类型的值
     * @param typeClass class类型
     * @param value 值
     * @return Object
     */
	private static Object getClassTypeValue(Class<?> typeClass, Object value){
        if(typeClass == int.class  || value instanceof Integer){
            if(null == value){
                return 0;
            }
            return value;
        }else if(typeClass == short.class){
            if(null == value){
                return 0;
            }
            return value;
        }else if(typeClass == byte.class){
            if(null == value){
                return 0;
            }
            return value;
        }else if(typeClass == double.class){
            if(null == value){
                return 0;
            }
            return value;
        }else if(typeClass == long.class){
            if(null == value){
                return 0;
            }
            return value;
        }else if(typeClass == String.class){
            if(null == value){
                return "";
            }
            return value;
        }else if(typeClass == boolean.class){
            if(null == value){
                return true;
            }
            return value;
        }else if(typeClass == BigDecimal.class){
            if(null == value){
                return new BigDecimal(0);
            }
            return new BigDecimal(value+"");
        }else {
            return typeClass.cast(value);
        }
    }

	/**
     * 处理字符串  如：  abc_dex ---> abcDex
     * @param str
     * @return
     */
    public static  String removeLine(String str){
		if(null != str && str.contains("_")){
			int i = str.indexOf("_");
			char ch = str.charAt(i+1);
			char newCh = (ch+"").substring(0, 1).toUpperCase().toCharArray()[0];
			String newStr = str.replace(str.charAt(i+1), newCh);
			String newStr2 = newStr.replace("_", "");
			return newStr2;
		}
		return str;
	}
    
	public static String getFiledName(Class<?> clazz) {
		Field[] fields = clazz.getDeclaredFields();
		StringBuffer sb = new StringBuffer();
		for (int i = 1; i < fields.length; i++) {
			if (i == fields.length - 1) {
				sb.append(fields[i].getName());
			} else {
				sb.append(fields[i].getName() + ",");
			}
		}
		return sb.toString();
	}
	
	public static List<Map<String, Object>> getFiledNameAndType(Class<?> clazz) {
		Field[] fields = clazz.getDeclaredFields();
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		for (int i = 1; i < fields.length; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("name", fields[i].getName());
			map.put("type", fields[i].getGenericType());
			list.add(map);
		}
		return list;
	}
}
